ホームに戻る
出典 :
データベース(Oracle)に接続する(ODBCを使用) | ExcelWork.info
関連 :
ODBCによるOracle DB接続
目次 :

VBAからのOracle DB接続(ODBC使用)

Oracle製ODBCドライバ(ここでは Instant Client 19.8)を使用してOracle DBに接続するためのサンプルコードを以下に記す。
ODBCの設定に関しては、 ODBCによるOracle DB接続 を参照のこと。
Sub Sample_ODBC_oracle() Const DRIVER = "{Oracle in instantclient_19_8}" ' ドライバ名 Const IP = "100.50.53.129" ' 接続先のIPアドレス Const PORT = "1521" ' ポート番号 Const NETSERVICENAME = "p2db" ' ネットサービス名 Const DSN = "PRIME2" ' データソース名 (tnsnames.ora で設定) Const USERNAME = "p2dbown" ' ユーザー名 Const PASSWORD = "p2dbown" ' パスワード ' --------------------------------------- ' 接続文字列の構成 ' (接続方法は以下のいずれかを選択する) Dim strCon As String #If 1 Then ' ドライバと接続先を直接指定する場合 strCon = "DRIVER=" & DRIVER strCon = strCon & ";DBQ=" & "(DESCRIPTION = " & _ "(ADDRESS = (PROTOCOL = TCP)" & _ "(HOST = " & IP & ")" & _ "(PORT = " & PORT & "))" & _ "(CONNECT_DATA = (SERVICE_NAME = " & NETSERVICENAME & ")))" #Else ' データソース名を指定する場合 ' (事前に tnsnames.ora でのデータソース定義が必要) strCon = "DSN=" & DSN #End If strCon = strCon & ";UID=" & USERNAME strCon = strCon & ";PWD=" & PASSWORD ' --------------------------------------- ' 接続確立 Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.ConnectionString = strCon cn.Open ' --------------------------------------- ' SQL文構成 Dim strSQL As String strSQL = "select * from table01 order by id desc" ' --------------------------------------- ' SQL文実行(データ取得) Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.Open strSQL, cn ' --------------------------------------- ' 取得したデータをワークシートに転記 Dim col As Long Dim row As Long With Worksheets("oracle_odbc") .Cells.Clear ' フィールド名 For col = 0 To rs.Fields.Count - 1 .Cells(1, col + 1) = rs(col).Name Next col ' レコード Do Until rs.EOF For col = 0 To rs.Fields.Count - 1 .Cells(row + 2, col + 1) = rs(col).Value Next col row = row + 1 rs.MoveNext Loop End With rs.Close cn.Close Set cn = Nothing End Sub

Recordset に読み込んだデータへのアクセス

Recordset (オブジェクト名を rs とする)のデータは、上記のようにフィールドのインデクス(0 起算)を指定するか、
またはフィールド名を直接指定することで取得できる。
データを読み込んだ直後は先頭のレコードを指しており、rs.MoveNext で次のレコードを指すようになる。
(繰り返すことで rs.EOF に到達するまで読み進めることができる)
rs.MoveFirst で先頭のレコードまで巻き戻すことも可能。
ここで、読み込んだデータが Null の場合、そのままユーザ定義型(Type)などに格納しようとするとエラーとなるため、
必要に応じて IsNull() プロシージャで Null かどうかを確認して対処する。
' インデクス(col)でフィールドを指定 ' col : 0 ~ rs.Fields.Count - 1 tempVal = rs(col).Value ' フィールド名("Hoge")でフィールドを指定 tempVal = rs.Fields("Hoge").Value ' 取得した値が Null であれば 0 に置換する If IsNull(tempVal) Then Cells(1, 1).Value = 0 Else Cells(1, 1).Value = tempVal End If